#include "comunicacao_servidor.h"

int executa_sistema_servidor(int sockfd){
  int opt, idfilme;
#ifdef MARCAR_TEMPOS_SERVIDOR
  char nome[200];
  char c = 'a';
  char indice[2];
  FILE *fp; /* Arquivo onde sao escritos os tempos */

  indice[1] = '\0';
  while(1){
    strcpy(nome, ARQ_TEMPO_SERVIDOR);
    indice[0] = c;
    c++;
    strcat(nome, indice);
    strcat(nome, EXT);
    if((fp = fopen(nome, "r")))
      fclose(fp);
    else
      break;
  }

  /* Abre o arquivo para escrita */
  fp = fopen(nome, "w");
#endif

  if(read_int(sockfd, &opt)<0)
    return -1;

  while(opt!=0){

    /* Envia numero de filmes cadastrados */
    if(write_int(sockfd, idAtual)<0)
      return -1;

    /* Seleciona opcao correta */
    switch(opt){
    case 1:
#ifdef MARCAR_TEMPOS_SERVIDOR
      gettimeofday(&t0_servidor, NULL);
#endif
      if(enviar_titulos(sockfd)<0)
	return -1;
      break;
    case 2:
      if(read_int(sockfd, &idfilme)<0)
	return -1;
#ifdef MARCAR_TEMPOS_SERVIDOR
      gettimeofday(&t0_servidor, NULL);
#endif
      if(enviar_sinopse_filme(sockfd, idfilme)<0)
	return -1;
      break;
    case 3:
      if(read_int(sockfd, &idfilme)<0)
	return -1;
#ifdef MARCAR_TEMPOS_SERVIDOR
      gettimeofday(&t0_servidor, NULL);
#endif
      if(enviar_informacoes_filme(sockfd, idfilme)<0)
	return -1;
      break;
    case 4:
#ifdef MARCAR_TEMPOS_SERVIDOR
      gettimeofday(&t0_servidor, NULL);
#endif
      if(enviar_tudo(sockfd)<0)
	return -1;
      break;
    }

#ifdef MARCAR_TEMPOS_SERVIDOR
  /* Salva o tempo medido em um arquivo */
  fprintf(fp, "%lf;\n", t1_servidor.tv_sec-t0_servidor.tv_sec+(t1_servidor.tv_usec-t0_servidor.tv_usec)/(double)1000000);
#endif

    /* Proxima opcao */
    if(read_int(sockfd, &opt)<0)
      return -1;
  }

#ifdef MARCAR_TEMPOS_SERVIDOR
  fclose(fp);
#endif


  return 0;
}

int enviar_titulos(int sockfd){
  int i;
  tFilme filme[MAX_FILMES];
  /* Carrega as informacoes */
  for(i=0; i<idAtual; i++)
    filme[i] = carregar_informacoes_filme(i);

#ifdef MARCAR_TEMPOS_SERVIDOR
  gettimeofday(&t1_servidor, NULL);
#endif

  /* Envia titulos */
  for(i=0; i<idAtual; i++)
    if(write_string(sockfd, filme[i].titulo, TAM_MAX_TITULO)<0)
      return -1;

  return 0;
}

int enviar_sinopse_filme(int sockfd, int idfilme){
  tFilme filme;
  filme = carregar_informacoes_filme(idfilme);
#ifdef MARCAR_TEMPOS_SERVIDOR
  gettimeofday(&t1_servidor, NULL);
#endif
  if(write_string(sockfd, filme.sinopse, TAM_MAX_SINOPSE)<0)
    return -1;
  return 0;
}

int enviar_informacoes_filme(int sockfd, int idfilme){
  tFilme filme;
  filme = carregar_informacoes_filme(idfilme);
#ifdef MARCAR_TEMPOS_SERVIDOR
  gettimeofday(&t1_servidor, NULL);
#endif
  if(write_string(sockfd, filme.titulo, TAM_MAX_TITULO)<0)
    return -1;
  if(write_string(sockfd, filme.horario, TAM_MAX_HORARIO)<0)
    return -1;
  if(write_int(sockfd, filme.sala)<0)
    return -1;
  if(write_string(sockfd, filme.sinopse, TAM_MAX_SINOPSE)<0)
    return -1;

  return 0;
}

int enviar_tudo(int sockfd){
  int i;
  tFilme filme[MAX_FILMES];
  /* Carrega as informacoes */
  for(i=0; i<idAtual; i++)
    filme[i] = carregar_informacoes_filme(i);

#ifdef MARCAR_TEMPOS_SERVIDOR
  gettimeofday(&t1_servidor, NULL);
#endif

  /* Envia os dados pedidos */
  for(i=0; i<idAtual; i++){
    if(write_string(sockfd, filme[i].titulo, TAM_MAX_TITULO)<0)
      return -1;
    if(write_string(sockfd, filme[i].horario, TAM_MAX_HORARIO)<0)
      return -1;
    if(write_int(sockfd, filme[i].sala)<0)
      return -1;
    if(write_string(sockfd, filme[i].sinopse, TAM_MAX_SINOPSE)<0)
      return -1;
  }

  return 0;
}
